package vic.logic;

import java.util.Random;

public class Board{
	private static final int ROW_NUMBER = 8;
	private static final int COLUMN_NUMBER = 8;
	private static final int ITEM_NUMBER = 6;
	
	public boolean status = false;
    public int[][] itemList;
    public boolean[][] tmpItemList;
    public int[] finishItems;
    
    public Board() {
    	itemList = createRandomData();
    }
    
    private int[][] createRandomData(){
		
		int itemList[][] = new int[8][8];
		
		  for (int i = 0 ; i < ROW_NUMBER ; i++) 
		  {
			  for (int j = 0 ; j < COLUMN_NUMBER ; j++) 
			  {
				  int randomValue = randomInt(1, ITEM_NUMBER);

				  if (i > 1) {
					  while(itemList[i-2][j] == randomValue && itemList[i-1][j] == randomValue){
						  randomValue = randomInt(1, ITEM_NUMBER);
					  }
				  }
				  
				  if (j > 1) {
					  while(itemList[i][j-2] == randomValue && itemList[i][j-1] == randomValue){
						  randomValue = randomInt(1, ITEM_NUMBER);

						  if (i > 1) {
							  while(itemList[i-2][j] == randomValue && itemList[i-1][j] == randomValue){
								  randomValue = randomInt(1, ITEM_NUMBER);
							  }
						  }

					  }
				  }

				  itemList[i][j] = randomValue;
			  }
		  }  		  		 
			  
		  return itemList;
	}
    
    public String itemListToString(){
    	String result = "";
    	
    	for (int i = 0 ; i < ROW_NUMBER ; i++) 
    	{
			  for (int j = 0 ; j < COLUMN_NUMBER ; j++) 
			  {
				  result += itemList[i][j] + ",";
			  }
    	}
    	
    	return result;
    }
    
    public String tmpItemListToString(){
    	String result = "";
    	
    	for (int i = 0 ; i < ROW_NUMBER ; i++) 
    	{
			  for (int j = 0 ; j < COLUMN_NUMBER ; j++) 
			  {
				  if(tmpItemList[i][j])
					  result += "1,";
				  else
					  result += "0,";
			  }
    	}
    	
    	return result;
    }
    
    /*
     * Move item và check xem nước đó có ăn hay không
     * Return
     * 		- result.status: có ăn hay không
     * 		- result.data: list item bàn cờ mới, đã lấp đầy những lỗ trống
     * 		- result.tmpData : bàn cờ đánh đấu true, false đánh dấu những quân ăn
     */
	public boolean moveItem(int row, int column, int new_row, int new_column)
	{
		System.out.println("Server: move item (" + row + "," + column +") -> (" + new_row + ", "+ new_column + ")");
		
		int item = itemList[row][column];
		int new_item = itemList[new_row][new_column];
		
		itemList[row][column] = new_item;
		itemList[new_row][new_column] = item;
			
		boolean status = verifyAllItem();
		
		if(status)		
		{
			createNewItems();		
		}
		else // Nếu move ko ăn, revert lại vị trí 2 quân cờ
		{
			itemList[row][column] = item;
			itemList[new_row][new_column] = new_item;
		}
		
		return status;
	}
	
	/*
     * Check all items
     * Return
     * 		- result.status: có ăn hay không
     * 		- result.data: list item bàn cờ mới, đã lấp đầy những lỗ trống
     * 		- result.tmpData : bàn cờ đánh đấu true, false đánh dấu những quân ăn
     */
	public boolean checkAllItems()
	{
		//System.out.println("Data json: " + boardJson);
		
		boolean status = verifyAllItem();
		
		if(status)		
		{
			createNewItems();		
		}
		
		return status;
	}
	
	/*
	 * Tạo dữ liệu item cho những vị trí trống
	 */
	public void createNewItems() {
		
		for (int i = ROW_NUMBER-1; i >= 0 ; i--) {
			for (int j = 0 ; j < COLUMN_NUMBER; j++) {
				if (itemList[i][j] == 0) {
					// look above for an icon to fill the hole
					int k = 1;
					while((i - k) >= 0 && itemList[i-k][j] == 0) {
						k++;
					}
					
					// Random quân tại vị trí trống	
					if ((i - k) < 0) {  
						// no icon found above : create random new icon
						int randomValue = Board.randomInt(1, ITEM_NUMBER);
	      
						itemList[i][j] = randomValue;
						
						System.out.println("add new item to (" + i + ", " + j + ") => " + itemList[i][j]);
					} 
					else 	// Chuyển quân trên xuống quân dưới
					{
						itemList[i][j] = itemList[i-k][j];
						itemList[i-k][j] = 0;
					}
					
				}
			}
		}
	};
	
	/*
	 * Check tất cả các quân cờ xem có quân nào ăn được hay không. Return true | false
	 */
	public boolean verifyAllItem() {
		
		boolean result = false;
		
		finishItems = new int[ITEM_NUMBER + 1];
		tmpItemList = new boolean[ROW_NUMBER][COLUMN_NUMBER];
		
		// Reset finishItems
		for (int i = 0; i <= ITEM_NUMBER; i++) {
			finishItems[i] = 0;
		}
		
		// Reset tmpItemList
		for (int i = 0; i < ROW_NUMBER; i++) {
			for (int j = 0; j < COLUMN_NUMBER; j++) {
				tmpItemList[i][j] = false;
			}
		}
		
		// verify từng item từ (0,0) -> (7,7)
		for (int i = 0; i < ROW_NUMBER; i++) {
			for (int j = 0 ; j < COLUMN_NUMBER; j++) {
				if (verifyItem(i, j)) {
					result = true;
				}
			}
		}
		
		// Set value = 0 cho những item được ăn
		for (int i = 0; i < ROW_NUMBER; i++) {
			for (int j = 0 ; j < COLUMN_NUMBER; j++) {
				if (tmpItemList[i][j]) {   
					finishItems[itemList[i][j]]++;
					itemList[i][j] = 0;
				}          
			}
		}
		
		System.out.println("Server: check all item => " + result);
		
		return result;
	};
	
	/*
	 * Check quân cờ tại vị trí (row, column) xem có ăn được hay không
	 * Result :
	 * 		- true : nếu ăn được
	 * 		- false: nếu không ăn được
	 */
	public boolean verifyItem(int row, int column) {
		boolean result = false;
	  
		int itemValue = itemList[row][column];
	  
		int vertical_item_num = 1;
		int horizontal_item_num = 1;
		int i;
		
		// Check dọc xuống
		if (!tmpItemList[row][column]) {
			i = 1;
			while(row + i < COLUMN_NUMBER && itemList[row+i][column] == itemValue && !tmpItemList[row+i][column]) {
				vertical_item_num++;
				i++;
			}
	    
			if (vertical_item_num >= 3) {	// Nếu ăn theo hàng dọc (quân ăn >= 3)
				result = true;
				
				tmpItemList[row][column] = true;
		      
				// Đánh dấu những quân bị ăn vào mảng Server.tmpItemList
				i = 1;
				while(row+i < COLUMN_NUMBER && itemList[row+i][column] == itemValue) {
					tmpItemList[row+i][column] = true;
					i++;
				} 
			}
		}

		// Check ngang
		if (!tmpItemList[row][column]) {
			i = 1;
	    
			while(column + i < ROW_NUMBER && itemList[row][column + i] == itemValue && !tmpItemList[row][column + i]) {
				horizontal_item_num++;
				
				i++;
			}

			if (horizontal_item_num >= 3) {	// Nếu ăn theo hàng ngang (quân ăn >= 3)
				result = true;

				tmpItemList[row][column] = true;
	      
				// right
				i = 1;
				while(column+i < ROW_NUMBER && itemList[row][column+i] == itemValue) {
		    	  // VH add
					tmpItemList[row][column+i] = true;
					i++;
				} 
			}
		} 
	  
		//System.out.println("check_item(" + row + ", " + column + ") => " + result);
		return result;
	}
    
    public static int randomInt(int min, int max){
		int result = min;
		
		Random random = new Random();
		
		result = random.nextInt(max) + min;
		
		return result;
	}
}
